SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[paActualizarPlazasDeTransferencia] 

@IdTransferencia INT,
@Op INT,
@ServicioRelacionado INT

AS
SET NOCOUNT ON
DECLARE @Error INT
DECLARE @Funcion INT
DECLARE @Cargo INT
DECLARE @Horas INT
DECLARE @Organizacion INT

BEGIN TRANSACTION

DECLARE @TipoTransferencia INT
SELECT @TipoTransferencia = (SELECT Tipo FROM tb_TransferenciasDeReestructura WHERE IdTransferencia = @IdTransferencia)

-- OP = 2 Es Baja de Servicios
IF @Op = 2 BEGIN

	IF (SELECT COUNT(*) FROM tb_BajasDeTransferencia WHERE Transferencia = @idtransferencia) = 1 BEGIN
		RAISERROR('No puede eliminar la Plaza de origen.', 16,1)
		SELECT @Error = @@Error
		GOTO Salir
	END

	DELETE FROM tb_BajasDeTransferencia WHERE IdBajaTransferencia = @ServicioRelacionado
	SET @Error = @@Error
	IF @Error <> 0 GOTO Salir

END-- OP = 3 Es Alta de Plazas a Abrir
IF @Op = 3 BEGIN	IF @TipoTransferencia = 12 BEGIN
		RAISERROR('No puede agregar Plazas de destino en un movimiento de baja.', 16,1)
		SELECT @Error = @@Error
		GOTO Salir
	END

	IF @TipoTransferencia IN(17, 16,18) AND EXISTS(SELECT * FROM tb_AltasTransferencia WHERE Transferencia = @idtransferencia) BEGIN
		RAISERROR('La Plaza de destino ya fue asignada.', 16,1)
		SELECT @Error = @@Error
		GOTO Salir
	END

	-- Si es Reubicacion la plaza tiene que tener equivalencia
	IF @TipoTransferencia = 16 BEGIN
		SELECT @Organizacion = Organizacion, @Funcion = Funcion, @Cargo = CargoSalarialDefault, @Horas = Horas FROM tb_Plazas P INNER JOIN tb_BajasDeTransferencia B ON B.Plaza = P.IdPlaza

		IF NOT EXISTS(SELECT top 1 IdAperturaReestructura FROM tb_AperturasDeReestructura WHERE Funcion = @Funcion AND CargoSalarialDefault = @Cargo AND Horas = @Horas AND IdAperturaReestructura = @ServicioRelacionado) BEGIN
			RAISERROR('La Plaza de destino debe tener la misma función y carga horaria que la de origen.', 16,1)
			SELECT @Error = @@Error
			GOTO Salir
		END
	END

	INSERT INTO tb_AltasTransferencia (Transferencia, PlazaActual, PlazaFutura, Estado, TipoAlta) 
	VALUES (@IdTransferencia, NULL, @ServicioRelacionado, 12, 12)
	SELECT @Error = @@Error
	IF @Error <> 0 GOTO Salir
END

-- OP = 4 Es Alta de Plazas Existentes
IF @Op = 4 BEGIN
	IF @TipoTransferencia = 12 BEGIN
		RAISERROR('No puede agregar Plazas de destino en un movimiento de baja.', 16,1)
		SELECT @Error = @@Error
		GOTO Salir
	END

	IF @TipoTransferencia IN(17, 16,18) AND EXISTS(SELECT * FROM tb_AltasTransferencia WHERE Transferencia = @idtransferencia) BEGIN
		RAISERROR('La Plaza de destino ya fue asignada.', 16,1)
		SELECT @Error = @@Error
		GOTO Salir
	END

	-- Si es Reubicacion la plaza tiene que tener equivalencia
	IF @TipoTransferencia = 16 BEGIN
		SELECT @Organizacion = Organizacion, @Funcion = Funcion, @Cargo = CargoSalarialDefault, @Horas = Horas FROM tb_Plazas P INNER JOIN tb_BajasDeTransferencia B ON B.Plaza = P.IdPlaza

		IF NOT EXISTS(SELECT top 1 idplaza FROM tb_Plazas WHERE Funcion = @Funcion AND CargoSalarialDefault = @Cargo AND Horas = @Horas AND IdPlaza = @ServicioRelacionado) BEGIN
			RAISERROR('La Plaza de destino debe tener la misma función y carga horaria que la de origen.', 16,1)
			SELECT @Error = @@Error
			GOTO Salir
		END
	END

	INSERT INTO tb_AltasTransferencia (Transferencia, PlazaActual, PlazaFutura, Estado, TipoAlta) 
	VALUES (@IdTransferencia, @ServicioRelacionado, NULL, 12, 12)
	SELECT @Error = @@Error
	IF @Error <> 0 GOTO Salir
END

-- OP = 5 Es Baja de Altas de Transferencias
IF @Op = 5 BEGIN
	DELETE FROM tb_AltasTransferencia WHERE IdAltaTransferencia = @ServicioRelacionado
	SELECT @Error = @@Error
	IF @Error <> 0 GOTO Salir
END

-- OP = 6 Es Alta de Servicios a Bajar
IF @Op = 6 BEGIN

	-- Si no es Transferencia
	IF @TipoTransferencia NOT IN(15) BEGIN
		RAISERROR('No puede agregar mas de una Plaza para este tipo de transferencia.', 16,1)
		SELECT @Error = @@Error
		GOTO Salir
	END
	-- Si es Transferencia, chequear el Regimen Salarial del servicio
	IF @TipoTransferencia = 15  AND EXISTS(SELECT top 1 idBajaTransferencia FROM tb_BajasDeTransferencia WHERE Transferencia = @idtransferencia) BEGIN
		-- Si es Cargo solo se admite una Plaza
		IF (SELECT C.RegimenSalarial FROM tb_ServiciosAgentes S INNER JOIN tb_Cargos C ON C.IdCargo = S.CargoSalarial WHERE S.IdServicioAgente = @ServicioRelacionado) = 12 BEGIN
			IF EXISTS(SELECT * FROM tb_BajasDeTransferencia B INNER JOIN tb_Plazas P ON P.IdPlaza = B.Plaza INNER JOIN tb_Cargos C ON C.IdCargo = P.CargoSalarialDefault WHERE B.Transferencia = @idtransferencia AND C.RegimenSalarial = 12) BEGIN
				RAISERROR('Sólo puede existir una Plaza de origen cuando el Regimen Salarial es Cargo.', 16,1)
				SELECT @Error = @@Error
				GOTO Salir
			END
			ELSE BEGIN
				RAISERROR('No puede agregar una Plaza destino con un Regimen Salarial distinto al de las Plazas Existentes.', 16,1)
				SELECT @Error = @@Error
				GOTO Salir
			END
		END
		-- Si es Horas se admiten varias plazas
		ELSE BEGIN
			IF EXISTS(SELECT top 1 idBajaTransferencia FROM tb_BajasDeTransferencia B INNER JOIN tb_Plazas P ON P.IdPlaza = B.Plaza INNER JOIN tb_Cargos C ON C.IdCargo = P.CargoSalarialDefault WHERE B.Transferencia = @idtransferencia AND C.RegimenSalarial = 12) BEGIN
				RAISERROR('No puede agregar una Plaza destino con un Regimen Salarial distinto al de las Plazas Existentes.', 16,1)
				SELECT @Error = @@Error
				GOTO Salir
			END
		END
	END

	DECLARE @agente INT
	SELECT @agente = (SELECT Agente FROM tb_ServiciosAgentes WHERE IdServicioAgente = @serviciorelacionado)
	DECLARE @plaza INT
	SELECT @plaza = (SELECT Plaza FROM tb_SubserviciosAgentes WHERE ServicioAgente = @serviciorelacionado AND Baja = 'N')

	INSERT INTO tb_BajasDeTransferencia (Transferencia, Plaza, Estado, TipoBaja) VALUES(@idtransferencia, @plaza, 12, 12)
	SET @Error = @@Error
	IF @Error <> 0 GOTO Salir
END

Salir:
IF @Error = 0 
	COMMIT TRANSACTION
ELSE
	ROLLBACK TRANSACTION
GO
GRANT EXECUTE ON  [dbo].[paActualizarPlazasDeTransferencia] TO [Reestructura]
GO
